/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.uoc.tds.cliente;

import java.rmi.RemoteException;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.NumberFormat;
import java.text.DecimalFormat;
import javax.swing.text.NumberFormatter;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import edu.uoc.tds.bean.*;
import edu.uoc.tds.common.*;

/**
 * Informe de los asistentes a un evento.
 *
 * @author Albert Calahorro.
 */
public class PantallaInformeAsistentesEvento extends javax.swing.JPanel {

    // Declaración componentes y objetos.
    private RemotoInterface objServeis = null;
    private static final long serialVersionUID = 1L;
    private UtilLenguaje txt = null;

    private JLabel labelUniversidad;
    private JLabel labelCentro;
    private JLabel labelEvento;

    private JComboBox comboUniversidad;
    private JComboBox comboCentro;
    private JComboBox comboEvento;

    private JCheckBox checkAsistentes;
    private JCheckBox checkNoAsistentes;
    
    private JButton botonBuscar;
    private JButton botonLimpiar;

    private JTable tabla = null;
    private JScrollPane jScrollPane = null;
    JScrollPane textScroll = null;

    public PantallaInformeAsistentesEvento(RemotoInterface pObjServeis) throws RemoteException {
        super();
        objServeis = pObjServeis;
        initComponents();
    }

    /**
    * Método para pintar el panel y añadir los botones y demás
    * componentes, así como sus propiedades
    */
    private void initComponents()
    {
        this.setLayout(null);
        this.setBounds(new Rectangle(0, 0, 800, 300));
        this.setSize(800, 600);

        // Checkboxs.
        checkAsistentes = new JCheckBox(txt.getMessage("pantInformeAsistentesEvento.check.asistentes"), true);
        checkAsistentes.setBounds(150, 120, 100, 25);
        this.add(checkAsistentes);

        checkNoAsistentes = new JCheckBox(txt.getMessage("pantInformeAsistentesEvento.check.noasistentes"), true);
        checkNoAsistentes.setBounds(300, 120, 150, 25);
        this.add(checkNoAsistentes);
      
        // Universidades.
        labelUniversidad = new JLabel();
        labelUniversidad.setText(txt.getMessage("pantInformeAsistentesEvento.label.universidad"));
        labelUniversidad.setBounds(75, 10, 100, 25);
        labelUniversidad.setHorizontalTextPosition(4);
        this.add(labelUniversidad);

        this.add(getComboUniversidad(), null);
        
        // Centros.
        labelCentro = new JLabel();
        labelCentro.setText(txt.getMessage("pantInformeAsistentesEvento.label.centro"));
        labelCentro.setBounds(105, 50, 100, 25);
        labelCentro.setHorizontalTextPosition(4);
        this.add(labelCentro);

        comboCentro = new JComboBox();
        comboCentro.setBounds(new Rectangle(150, 50, 320, 25));
        // Evento para cargar Tipos de Centro al seleccionar Centro.
        comboCentro.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evtC) {
                ComboCentroActionPerformed(evtC);
            }
        });
        this.add(comboCentro);        

        // Tipos Evento.
        labelEvento = new JLabel();
        labelEvento.setText(txt.getMessage("pantInformeAsistentesEvento.label.evento"));
        labelEvento.setBounds(105, 90, 100, 25);
        labelEvento.setHorizontalTextPosition(4);
        this.add(labelEvento);

        comboEvento = new JComboBox();
        comboEvento.setBounds(new Rectangle(150, 90, 320, 25));
        this.add(comboEvento);

        CargarCentros(0);

        // Botones.
        this.add(getBotonBuscar(), null);

        // Tabla.
        tabla = new JTable();
        this.add(tabla);
        this.add(getJScrollPane(), null);
        jScrollPane.setViewportView(getTablaResultados());
    }

    private JButton getBotonBuscar() {
        if (botonBuscar == null) {
            botonBuscar = new JButton();
            botonBuscar.setBounds(new Rectangle(30, 300, 80, 25));
            botonBuscar.setText(txt.getMessage("pantInformeAsistentesEvento.boton.buscar"));
            botonBuscar.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {

                    jScrollPane.setViewportView(getTablaResultados());

                }
            });
        }
        return botonBuscar;
    }

    private JComboBox getComboUniversidad() {

        if (comboUniversidad == null) {
            comboUniversidad = new JComboBox();
            Vector<MostrarCombo> vUniversidad = null;
            try {
                vUniversidad = objServeis.listaUniversidades();
                comboUniversidad = new JComboBox(vUniversidad);
                comboUniversidad.setBounds(new Rectangle(150, 10, 320, 25));

                // Evento para cargar Centros al seleccionar Universidad.
                comboUniversidad.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        ComboUniversidadActionPerformed(evt);
                    }
                });

            } catch (Exception eRe) {
                JOptionPane.showMessageDialog(null,
                        txt.getMessage("Informe.error.remoto") + "\n" + eRe.getMessage(),
                        txt.getMessage("Informe.error"), JOptionPane.ERROR_MESSAGE);

            }

        }
        return comboUniversidad;
    }

    // Evento que carga los centros al seleccionar universidad.
    private void ComboUniversidadActionPerformed(java.awt.event.ActionEvent evt) {
        CargarCentros(new Integer(((MostrarCombo) comboUniversidad.getSelectedItem()).getID()));
    }

    // Evento que carga los tipos de evento al seleccionar centro.
    private void ComboCentroActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            rellenarEventos(new Integer(((MostrarCombo) comboUniversidad.getSelectedItem()).getID()),
                            new Integer(((MostrarCombo) comboCentro.getSelectedItem()).getID()));
        } catch (RemoteException ex) {
            JOptionPane.showMessageDialog(null,
                UtilLenguaje.getMessage("err.remoto") + "\n" + ex.getMessage(),
                UtilLenguaje.getMessage("err"), JOptionPane.ERROR_MESSAGE);
        }
    }
   
    private void CargarCentros(Integer IdUniversidad) {
        try {
            rellenarCentros(IdUniversidad);
        } catch (RemoteException ex) {
            JOptionPane.showMessageDialog(null,
                UtilLenguaje.getMessage("err.remoto") + "\n" + ex.getMessage(),
                UtilLenguaje.getMessage("err"), JOptionPane.ERROR_MESSAGE);
        }

        // Cargamos los tipos de evento ya que habrá modificado el Centro.
        MostrarCombo centroCombo = (MostrarCombo) comboCentro.getSelectedItem();
        if (centroCombo != null){
            CargarEventos(IdUniversidad, new Integer(((MostrarCombo) comboCentro.getSelectedItem()).getID()));
        }else{
            CargarEventos(IdUniversidad, 0);
        }
    }

    // Cargar los centros a partir de la Universidad seleccionada.
    private void rellenarCentros(Integer idUniversidad) throws RemoteException {
        Vector<MostrarCombo> listaCentrosUniversidad = objServeis.listaCentrosUniversidad(idUniversidad);
        comboCentro.setModel(new javax.swing.DefaultComboBoxModel(listaCentrosUniversidad));
    }

    private void CargarEventos(Integer idUniversidad, Integer IdCentro) {
        try {
            rellenarEventos(idUniversidad, IdCentro);
        } catch (RemoteException ex) {
            JOptionPane.showMessageDialog(null,
                UtilLenguaje.getMessage("err.remoto") + "\n" + ex.getMessage(),
                UtilLenguaje.getMessage("err"), JOptionPane.ERROR_MESSAGE);
        }
    }

    // Cargar los tipos de evento a partir del centro seleccionado.
    private void rellenarEventos(Integer idUniversidad, Integer idCentro) throws RemoteException {
        Vector<MostrarCombo> listaEvento = objServeis.listaEventosCelebrados(idUniversidad, idCentro);
        comboEvento.setModel(new javax.swing.DefaultComboBoxModel(listaEvento));
    }


    class MyTableModel extends AbstractTableModel {

        private static final long serialVersionUID = 1L;
        protected List vCapcelera = new ArrayList();
        protected List vFilas = new ArrayList();

        public MyTableModel(List<InformeAsistentesEvento> vCv) {
            setCapcelera();
            setResulTabla(vCv);
        }

        protected void setCapcelera() {
            vCapcelera.add(txt.getMessage("pantInformeAsistentesEvento.tabla.nombre"));
            vCapcelera.add(txt.getMessage("pantInformeAsistentesEvento.tabla.apellidos"));
            vCapcelera.add(txt.getMessage("pantInformeAsistentesEvento.tabla.dni"));
            vCapcelera.add(txt.getMessage("pantInformeAsistentesEvento.tabla.asistencia"));

        }

        private void setResulTabla(List<InformeAsistentesEvento> vCv) {
            try {
                List<String> nombre = new ArrayList();
                List<String> apellidos = new ArrayList();
                List<String> dni = new ArrayList();
                List<String> asistencia = new ArrayList();

                for (Iterator<InformeAsistentesEvento> it = vCv.iterator(); it.hasNext();) {
                    InformeAsistentesEvento cv = it.next();
                    nombre.add(cv.getNombre());
                    apellidos.add(cv.getApellidos());
                    dni.add(cv.getDni());
                    asistencia.add(cv.getAsistencia());
                }

                vFilas.add(nombre);
                vFilas.add(apellidos);
                vFilas.add(dni);
                vFilas.add(asistencia);

            } catch (Exception e) {
            }
        }

        public int getRowCount() {
            return (((List) vFilas.get(0)).size());
        }

        public int getColumnCount() {
            return (vFilas.size());
        }

        public String getColumnName(int col) {
            return ((String) vCapcelera.get(col));
        }

        public boolean getScrollableTrackViewportHeight() {
            return (true);
        }

        public boolean getScrollableTrackViewportWidth() {
            return (true);
        }

        public Object getValueAt(int fila, int col) {
            return (((List) vFilas.get(col)).get(fila));
        }

        public boolean isCellEditable(int fila, int columna) {
            return (false);
        }
    }

    private JScrollPane getJScrollPane() {
        if (jScrollPane == null) {
            jScrollPane = new JScrollPane();
            jScrollPane.setBounds(new Rectangle(10, 150, 570, 140));
        }
        jScrollPane.setVisible(true);
        return jScrollPane;
    }

    private JTable getTablaResultados() {
        try {

            Integer idEvento;

            MostrarCombo eventoCombo = (MostrarCombo) comboEvento.getSelectedItem();
            if (eventoCombo != null){
                idEvento = eventoCombo.getID();
            }else{
                idEvento = 0;
            }

            try {

                List informe = objServeis.listaInformeAsistentesEvento(idEvento, checkAsistentes.isSelected(), checkNoAsistentes.isSelected());

                MyTableModel myTableModel = new MyTableModel(informe);
                tabla.setModel(myTableModel);

                int anchocolumna=0;
                TableColumn columna;

                for (int i=0;i<=3;i++){
                    columna = tabla.getColumnModel().getColumn(i);

                    switch (i){
                        case 0: anchocolumna = 150; break;
                        case 1: anchocolumna = 200; break;
                        case 2: anchocolumna = 100; break;
                        case 3: anchocolumna = 50; break;
                    }

                    columna.setPreferredWidth(anchocolumna);
                }

                jScrollPane.setVisible(true);

            } catch (Exception u) {
                System.out.print(u);
            }

        } catch (Exception eRe) {
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("client.err.remot") + "\n" + eRe.getMessage(),
                    txt.getMessage("client.err"), JOptionPane.ERROR_MESSAGE);
        }
        return tabla;
    }
}
